package com.zhiyou.common.service;
import java.util.List;
import org.apache.ibatis.session.RowBounds;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import tk.mybatis.mapper.common.Mapper;

public abstract class BaseService<T> {

    public abstract Mapper<T> getMapper();
    /**
     * 保存一个实体，null的属性也会保存，不会使用数据库默认值
     *
     * @param entity 实体对象
     * @return 返回结果
     */
    public int save(T entity) throws Exception {
        return getMapper().insert(entity);
    }

    /**
     * 根据主键更新属性不为null的值
     *
     * @param entity 实体对象
     * @return 返回结果
     */
    public int update(T entity) throws Exception {
        return getMapper().updateByPrimaryKeySelective(entity);
    }

    /**
     * 根据主键字段进行删除，方法参数必须包含完整的主键属性
     *
     * @param key 主键
     * @return 返回结果
     */
    public int deleteById(Object key) throws Exception {
        return getMapper().deleteByPrimaryKey(key);
    }

    /**
     * 根据实体属性作为条件进行删除，查询条件使用等号
     *
     * @param entity 实体对象
     * @return 返回结果
     */
    public int delete(T entity) throws Exception {
        return getMapper().delete(entity);
    }

    /**
     * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     *
     * @param key 主键
     * @return 返回结果
     */
    public T getById(Object key) {
        return getMapper().selectByPrimaryKey(key);
    }

    /**
     * 查询全部结果
     *
     * @return 返回结果
     */
    public List<T> findAll() {
        return getMapper().selectAll();
    }

    /**
     * 根据实体中的属性进行查询，只能有一个返回值，有多个结果是抛出异常，查询条件使用等号
     *
     * @param entity 实体对象
     * @return 返回结果
     */
    public T findOne(T entity) {
        return getMapper().selectOne(entity);
    }

    /**
     * 根据实体中的属性值进行查询
     *
     * @param entity 实体对象
     * @return 返回结果
     */
    public List<T> find(T entity) {
        return getMapper().select(entity);
    }

    /**
     * 根据实体中的属性值进行查询带分页
     *
     * @param entity 实体对象
     * @return 返回结果
     */
    public List<T> find(T entity, Integer pageNum, Integer pageSize) {
        return getMapper().selectByRowBounds(entity, new RowBounds(pageNum, pageSize));
    }

    /**
     * 查询条数
     *
     * @param entity 实体对象
     * @return 返回结果
     */
    public int findCount(T entity) {
        return getMapper().selectCount(entity);
    }

    /**
     * 根据实体中的属性值进行分页查询，返回PageInfo对象
     *
     * @param entity   实体对象
     * @param pageNum  页码
     * @param pageSize 每页显示的条数
     * @return 返回结果
     */
    public PageInfo<T> findPageInfo(T entity, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<T> list = find(entity);
        PageInfo<T> pageInfo = new PageInfo<T>(list);
        return pageInfo;
    }

    /**
     * 根据Example条件进行查询
     *
     * @param example 查询条件
     * @return 返回结果
     */
    public List<T> findByExample(Object example) {
        return getMapper().selectByExample(example);
    }

    /**
     * 根据example条件进行分页查询
     *
     * @param example  查询条件
     * @param pageNum  页码
     * @param pageSize 每页显示的条数
     * @return 返回结果
     */
    public List<T> findByExample(Object example, int pageNum, int pageSize) {
        return getMapper().selectByExampleAndRowBounds(example, new RowBounds(pageNum, pageSize));
    }

    /**
     * 根据Example条件进行查询总数
     *
     * @param example 查询条件
     * @return 返回结果
     */
    public int findCountByExample(Object example) {
        return getMapper().selectCountByExample(example);
    }

    /**
     * 根据Example条件进行分页查询，查询条件使用等号，返回PageInfo对象
     *
     * @param example  查询条件
     * @param pageNum  页码
     * @param pageSize 每页显示的条数
     * @return 返回结果
     */
    public PageInfo<T> findPageInfoByExample(Object example, Integer pageNum, Integer pageSize) {

        if (pageNum == null) {
            pageNum = 0;
        }
        if (pageSize == null) {
            pageSize = 0;
        }
        PageHelper.startPage(pageNum, pageSize);
        List<T> list = findByExample(example);
        return new PageInfo<T>(list);
    }
}
